package com.qc31.baselib.utils

import android.app.Activity
import android.content.Context
import android.graphics.Bitmap
import android.net.Uri
import android.widget.ImageView
import androidx.fragment.app.Fragment
import com.bumptech.glide.Glide
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade
import com.bumptech.glide.request.RequestOptions
import com.qc31.baselib.R
import kotlin.concurrent.thread

/**
 * @link https://github.com/wasabeef/glide-transformations
 * implementation 'jp.wasabeef:glide-transformations:4.x.x'
 *
 * 生命周期关联 尽量使用Activity和fragment
 */

/** 加载图片 @context 上下问对象 @url 图片链接 */
fun ImageView.loadStringImgError(
    context: Context,
    url: String
) {
    Glide.with(context).asBitmap().load(url).into(this)
}

/** 加载图片 @activity 上下问对象 @url 图片链接 */
fun ImageView.loadStringImgError(
    activity: Activity,
    url: String
) {
    Glide.with(activity).asBitmap().load(url).into(this)
}

/** 加载图片 @fragment 上下问对象 @url 图片链接 */
fun ImageView.loadStringImgError(
    fragment: Fragment,
    url: String
) {
    Glide.with(fragment).asBitmap().load(url).into(this)
}

/** 加载图片 @context 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadStringDImgError(
    context: Context,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(url).error(error).into(this)
}

/** 加载图片 @context 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadStringDImgErrorP(
    context: Context,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(url).placeholder(error).error(error).into(this)
}

/** 加载图片 @activity 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadStringNoneImg(
    activity: Activity,
    url: String
) {
    Glide.with(activity).asBitmap().load(url).diskCacheStrategy(DiskCacheStrategy.NONE).into(this)
}

/** 加载图片 @activity 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadStringNoneImg(
    activity: Context,
    url: String
) {
    Glide.with(activity).asBitmap().load(url).diskCacheStrategy(DiskCacheStrategy.NONE).into(this)
}

/** 加载图片 @activity 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadStringDImgError(
    activity: Activity,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(activity).asBitmap().load(url).error(error).into(this)
}

/** 加载图片 @fragment 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadStringDImgError(
    fragment: Fragment,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(fragment).asBitmap().load(url).error(error).into(this)
}

/** 加载图片 @context 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadIdDImgError(
    context: Context,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(id).error(error).into(this)
}

/** 加载图片 @activity 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadIntDImgError(
    activity: Activity,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(activity).asBitmap().load(id).error(error).into(this)
}

/** 加载图片 @activity 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadIntDImgError(
    context: Context,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(id).error(error).into(this)
}

/** 加载图片 @activity 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadGif(
    context: Context,
    id: Int

) {
    Glide.with(context).asGif().load(id).into(this)
}

/** 加载图片 @fragment 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadIntDImgError(
    fragment: Fragment,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(fragment).asBitmap().load(id).error(error).into(this)
}


/** 加载图片 @context 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadStringImgNoneError(
    context: Context,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(url).error(error)
        .skipMemoryCache(true)
        .diskCacheStrategy(DiskCacheStrategy.NONE).into(this)
}

/** 加载图片 @activity 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadStringImgNoneError(
    activity: Activity,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(activity).asBitmap().load(url).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE).into(this)
}

/** 加载图片 @fragment 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadStringImgNoneError(
    fragment: Fragment,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(fragment).asBitmap().load(url).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE).into(this)
}

/** 加载图片 @context 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadIdImgNoneError(
    context: Context,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(id).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE).into(this)
}

/** 加载图片 @activity 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadIntImgNoneError(
    activity: Activity,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(activity).asBitmap().load(id).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE).into(this)
}

/** 加载图片 @fragment 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadIntImgNoneError(
    fragment: Fragment,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(fragment).asBitmap().load(id).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE).into(this)
}

//****************************************************圆形**********************************************
/** 加载圆形图片 @context 上下问对象 @url 图片链接 */
fun ImageView.loadCircleStringImg(
    context: Context,
    url: String
) {
    Glide.with(context).asBitmap().load(url)
        .apply(requestOptions()).into(this)
}

/** 加载圆形图片 @activity 上下问对象 @url 图片链接 */
fun ImageView.loadCircleStringImg(
    activity: Activity,
    url: String
) {
    Glide.with(activity).asBitmap().load(url)
        .apply(RequestOptions.circleCropTransform()).into(this)
}

/** 加载圆形图片 @fragment 上下问对象 @url 图片链接 */
fun ImageView.loadCircleStringImg(
    fragment: Fragment,
    url: String
) {
    Glide.with(fragment).asBitmap().load(url)
        .apply(requestOptions()).into(this)
}

/** 加载圆形图片 @context 上下问对象 @id 图片资源Id */
fun ImageView.loadCircleIntImg(
    context: Context,
    id: Int
) {
    Glide.with(context).asBitmap().load(id)
        .apply(requestOptions()).into(this)
}

/** 加载圆形图片 @activity 上下问对象 @id 图片资源Id */
fun ImageView.loadCircleIntImg(
    activity: Activity,
    id: Int
) {
    Glide.with(activity).asBitmap().load(id)
        .apply(requestOptions()).into(this)
}

/** 加载圆形图片 @fragment 上下问对象 @id 图片资源Id */
fun ImageView.loadCircleIntImg(
    fragment: Fragment,
    id: Int
) {
    Glide.with(fragment).asBitmap().load(id)
        .apply(requestOptions()).into(this)
}

/** 加载圆形图片 @activity 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadCircleStringImgError(
    activity: Activity,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(activity).asBitmap().load(url).error(error)
        .apply(RequestOptions.circleCropTransform()).into(this)
}

/** 加载圆形图片 @context 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadCircleStringImgError(
    context: Context,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(url).error(error)
        .apply(requestOptions()).into(this)
}

/** 加载圆形图片 @fragment 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadCircleStringImgError(
    fragment: Fragment,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(fragment).asBitmap().load(url).error(error)
        .apply(requestOptions()).into(this)
}

/** 加载圆形图片 @context 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadCircleIntImgError(
    context: Context,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(id).error(error)
        .apply(requestOptions()).into(this)
}

/** 加载圆形图片 @activity 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadCircleIntImgError(
    activity: Activity,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(activity).asBitmap().load(id).error(error)
        .apply(requestOptions()).into(this)
}

/** 加载圆形图片 @fragment 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadCircleIntImgError(
    fragment: Fragment,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(fragment).asBitmap().load(id).error(error)
        .apply(requestOptions()).into(this)
}

/** 加载圆形图片 @context 上下问对象 @url 图片链接 */
fun ImageView.loadCircleStringImgNone(
    context: Context,
    url: String
) {
    Glide.with(context).asBitmap().load(url)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .apply(requestOptions())
        .into(this)
}

/** 加载圆形图片 @activity 上下问对象 @url 图片链接 */
fun ImageView.loadCircleStringImgNone(
    activity: Activity,
    url: String
) {
    Glide.with(activity).asBitmap().load(url)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .apply(requestOptions())
        .into(this)
}

/** 加载圆形图片 @fragment 上下问对象 @url 图片链接 */
fun ImageView.loadCircleStringImgNone(
    fragment: Fragment,
    url: String
) {
    Glide.with(fragment).asBitmap().load(url)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .apply(requestOptions())
        .into(this)
}

/** 加载圆形图片 @context 上下问对象 @id 图片资源Id */
fun ImageView.loadCircleIntImgNone(
    context: Context,
    id: Int
) {
    Glide.with(context).asBitmap().load(id)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .apply(RequestOptions.circleCropTransform())
        .into(this)
}

/** 加载圆形图片 @activity 上下问对象 @id 图片资源Id */
fun ImageView.loadCircleIntImgNone(
    activity: Activity,
    id: Int
) {
    Glide.with(activity).asBitmap().load(id)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .apply(requestOptions())
        .into(this)
}

/** 加载圆形图片 @fragment 上下问对象 @id 图片资源Id */
fun ImageView.loadCircleIntImgNone(
    fragment: Fragment,
    id: Int
) {
    Glide.with(fragment).asBitmap().load(id)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .apply(requestOptions())
        .into(this)
}

/** 加载圆形图片 @activity 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadCircleStringImgNoneError(
    activity: Activity,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(activity).asBitmap().load(url).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .apply(RequestOptions.circleCropTransform())
        .into(this)
}

/** 加载圆形图片 @context 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadCircleStringImgNoneError(
    context: Context,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(url).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .apply(requestOptions())
        .into(this)
}

/** 加载圆形图片 @fragment 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadCircleStringImgNoneError(
    fragment: Fragment,
    url: String,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(fragment).asBitmap().load(url).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .apply(RequestOptions.circleCropTransform())
        .into(this)
}

/** 加载圆形图片 @context 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadCircleIntImgNoneError(
    context: Context,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(id).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .apply(requestOptions())
        .into(this)
}

/** 加载圆形图片 @activity 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadCircleIntImgNoneError(
    activity: Activity,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(activity).asBitmap().load(id).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE) //不做磁盘缓存
        .skipMemoryCache(true)  //不做内存缓存
        .apply(requestOptions())
        .into(this)
}

/** 加载圆形图片 @fragment 上下问对象 @id 图片资源Id @error 加载失败占位图资源Id */
fun ImageView.loadCircleIntImgNoneError(
    fragment: Fragment,
    id: Int,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(fragment).asBitmap().load(id).error(error)
        .diskCacheStrategy(DiskCacheStrategy.NONE) //不做磁盘缓存
        .skipMemoryCache(true)  //不做内存缓存
        .apply(requestOptions())
        .into(this)
}

/** 加载图片 @fragment 上下问对象 @url 图片链接 @error 加载失败占位图资源Id */
fun ImageView.loadVideoImg(
    context: Context,
    url: String,
    frame: Long,
    error: Int = R.mipmap.ic_default_error
) {
    Glide.with(context).asBitmap().load(url).error(error).placeholder(error).frame(frame).into(this)
}

private fun requestOptions() = RequestOptions.circleCropTransform()

/** 清除内存缓存 @activity 上下问对象 */
fun clearGlideMemory(activity: Activity) {
    Glide.get(activity).clearMemory()
}

/** 清除磁盘缓存 @activity 上下问对象 */
fun clearGlideDisk(activity: Activity) {
    thread(start = true) { Glide.get(activity).clearDiskCache(); }
}

fun ImageView.loadGifAsBitmap(context: Context, gifUri: Uri) {
    Glide.with(context).asBitmap().load(gifUri).into(this);
}

fun ImageView.loadGif(context: Context, gifUri: Uri) {
    Glide.with(context).asGif().load(gifUri).into(this);
}

fun ImageView.loadPhoto(context: Context, uri: Uri) {
    Glide.with(context).load(uri).transition(withCrossFade()).into(this)
}

fun Context.getCacheBitmap(uri: Uri, width: Int, height: Int): Bitmap {
    return Glide.with(this).asBitmap().load(uri).submit(width, height).get()
}

